package com.burns.study.leetcode.learning.chapter1;/**
 * Created by burns.
 *
 * @author <a href="http://www.esoon-soft.com/">burns</a>
 * @date 2021/07/03 8:11
 */

/**
 * 暴力枚举
 * 思路及算法:
 * 最容易想到的方法是枚举数组中的每一个数 x，寻找数组中是否存在 target - x。
 * 当我们使用遍历整个数组的方式寻找 target - x 时，需要注意到每一个位于 x 之前的元素都已经和 x 匹配过，因此不需要再进行匹配。而每一个元素不能被使用两次，所以我们只需要在 x 后面的元素中寻找 target - x。
 *复杂度分析
 * 时间复杂度：O(N^2)O(N * 2 *  )，其中 NN 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。
 *
 * 空间复杂度：O(1)O(1)。
 * @ClassName TwoSum
 * @Author Burns
 * @DAte 2021/7/3 8:11
 */
public class TwoSum_1 {
    public static void main(String[] args){
        int[] nums = {2,7,11,15};
        int target = 17;
        int[] ints = twoSum(nums, target);

        StringBuilder sb = new StringBuilder("检索结果下标：");
        for (int i=0;i<ints.length;i++){
            sb.append(ints[i]+"、");
        }
        System.out.println(sb);

    }
    public static int[] twoSum(int[] nums, int target) {
        int n = nums.length;
        //第一层循环下标从0到nums.length-1
        for (int i = 0; i < n; ++i) {
            //第二层循环下标从第一层循环的下一个数到nums.length-1
            //tips:1、为啥不从和上一个相同的数字开始，审题，人家要求：数组中同一个元素在答案里不能重复出现。
            //tips:2、为啥第二次循环不从下标0开始，原因是：1、增加循环次数，即增加时间复杂度2、需要增加判断i!=j这种情况，3、可能会输出[0,3]和[3,0]，这两种情况是一个意思，只不过顺序不一样，所以需要去重
            for (int j = i + 1; j < n; ++j) {
                //判断第一层和第二次循环的数值相加是否等于目标值
                if (nums[i] + nums[j] == target) {
                    return new int[]{i, j};
                }
            }
        }
        return new int[0];
    }

}
